﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace DynamicControls {
  public class DynamicPanel : Panel, ICallbackEventHandler, ICallbackContainer {

    public event EventHandler Refresh;
    public event EventHandler MyRefresh;

    public void RaiseCallbackEvent(string eventArgument) {
      // Инициировать событие для уведомления клиента о том, что затребовано обновление. 
      if (Refresh != null) {
        Refresh(this, EventArgs.Empty);
      }

      if (MyRefresh != null) {
        MyRefresh(this, EventArgs.Empty);
      }
    }

    public string GetCallbackResult() {
      // Подготовить текстовый ответ, который будет отправлен обратно странице. 
      EnsureChildControls();
      using (StringWriter sw = new StringWriter()) {
        using (HtmlTextWriter writer = new HtmlTextWriter(sw)) {
          // Добавить идентификатор этой панели, 
          writer.Write(this.ClientID + "_");
          // Сгенерировать только часть страницы, находящуюся внутри панели, 
          this.RenderContents(writer);
        }
        return sw.ToString();
      }
    }

    protected override void OnInit(EventArgs e) {
      base.OnInit(e);
      string script = @"<script type='text/javascript'>
        function RefreshPanel(result, context) {
          if (result != '') {
            // Разделить строку снова на две части: идентификатор панели и HTML-содержимое. 
            var separator = result.indexOf('_'); 
            var elementName = result.substr(0, separator);
            // Найти панель. 
            var panel = document.getElementById(elementName); 
            // Заменить ее содержимое. 
            panel.innerHTML = result.substr(separator + 1);
          } 
        } 
      </script>";
      Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "RefreshPanel", script);
    }

    public string GetCallbackScript(IButtonControl buttonControl, string argument) {
      return Page.ClientScript.GetCallbackEventReference(this, "", "RefreshPanel", "null", true);
    } 

  }

  public class DynamicPanelRefreshLink : LinkButton {
    public string PanelID {
      get { return (string)ViewState["DynamicPanelID"]; }
      set { ViewState["DynamicPanelID"] = value; }
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer) {
      DynamicPanel pnl = (DynamicPanel)Page.FindControl(PanelID);
      if (pnl != null) {
        writer.AddAttribute("onclick", pnl.GetCallbackScript(this, ""));
        writer.AddAttribute("class", "RefreshLink");
      }
    } 


  }

}
